#include <iostream>
#include <future>

//C++11 异步操作
//std::future是C++11标准库中的⼀个模板类，它表⽰⼀个异步操作的结果。当我们在多线程编程中使⽤
// 异步任务时，std::future可以帮助我们在需要的时候获取任务的执⾏结果。std::future的⼀个重要特性
// 是能够阻塞当前线程，直到异步操作完成，从⽽确保我们在获取结果时不会遇到未完成的操作。
// 应⽤场景
// • 异步任务： 当我们需要在后台执⾏⼀些耗时操作时，如⽹络请求或计算密集型任务等，std::future
// 可以⽤来表⽰这些异步任务的结果。通过将任务与主线程分离，我们可以实现任务的并⾏处理，从⽽提⾼程序的执⾏效率
// • 并发控制： 在多线程编程中，我们可能需要等待某些任务完成后才能继续执⾏其他操作。通过使⽤
// std::future，我们可以实现线程之间的同步，确保任务完成后再获取结果并继续执⾏后续操作
// • 结果获取：std::future提供了⼀种安全的⽅式来获取异步任务的结果。我们可以使⽤
// std::future::get()函数来获取任务的结果，此函数会阻塞当前线程，直到异步操作完成。这样，在调⽤get()函数时，我们可以确保已经获取到了所需的结果
// ⽤法⽰例
// • 使⽤ std::async关联异步任务
// std::async是⼀种将任务与std::future关联的简单⽅法。它创建并运⾏⼀个异步任务，并返回⼀个与该
// 任务结果关联的std::future对象。默认情况下，std::async是否启动⼀个新线程，或者在等待future时，任务是否同步运⾏都取决于你给的 参数。这个参数为std::launch类型：
// ◦ std::launch::deferred 表明该函数会被延迟调⽤，直到在future上调⽤get()或者wait()才会开始执⾏任务
// ◦ std::launch::async 表明函数会在⾃⼰创建的线程上运⾏
// ◦ std::launch::deferred | std::launch::async 内部通过系统等条件⾃动选择策略

int Add(int num1,int num2)
{
    std::cout<<"into add"<<std::endl;
    return num1+num2;
}

int main()
{
    // std::future<int> res = std::async(std::launch::async,Add,11,22);//进行异步非阻塞调用
    std::future<int> res = std::async(std::launch::deferred,Add,11,22);
    std::this_thread::sleep_for(std::chrono::seconds(1));//休眠
    std::cout<<"------------------"<<std::endl;
    std::cout<<res.get()<<std::endl;//用于获取异步结果,异步没有结果就会阻塞
    return 0;
}